package com.example.leo.mycharmingstudent.a0827;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.ToggleButton;

import com.example.leo.mycharmingstudent.R;
import com.example.leo.mycharmingstudent.a08280829.FragmentClazzActivity;
import com.example.leo.mycharmingstudent.a0829practice.ClazzDemoActivity;

/**
 * 0827
 * 内容：
 * ToggleButton、SeekBar最基本的用法
 * 11:40咱们正式上课
 */
public class WidgetActivity extends AppCompatActivity {

    //常量用大写，所有单词大写
    private static final String TAG = "WidgetActivity";
    /*
    小驼峰写法：首单词或字母小写，其余单词首字母大写
    举个栗子：tvShow,mIndex,sIndex
    大驼峰写法：单词首字母大写，其余小写
    举个栗子：WidgetActivity 参考类名
     */

    //成员变量前面加小写m，遵循小驼峰写法
    private int mIndex;
    //静态成员变量前面加小写s，遵循小驼峰写法
    private static int sIndex;
    //控件前面可以使用控件缩写小写字母，遵循小驼峰写法
    private TextView tvShow;
    //开关按钮
    private ToggleButton tgToggle;
    //寻找条
    private SeekBar sbSeek;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.widget_activity);

        findViews();
        initData();
        initEvent();
    }

    /**
     * findViewById操作
     */
    private void findViews() {
        tvShow = findViewById(R.id.tv_show_widget_activity);
        tgToggle = findViewById(R.id.tg_toggle_widget_activity);
        sbSeek = findViewById(R.id.sb_seek_widget_activity);
    }

    /**
     * 初始化数据
     */
    private void initData() {
        //典型的值传递
        Math.abs(0.1);
    }

    /**
     * 初始化点击事件或者其他事件
     */
    private void initEvent() {
        View.OnClickListener onClickListener = new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                startActivity(new Intent(WidgetActivity.this,
                        ClazzDemoActivity.class));
            }
        };
        //典型的址传递
        tvShow.setOnClickListener(onClickListener);

        tgToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (isChecked) {
                    Log.d(TAG, "选中啦！");
                } else {
                    Log.d(TAG, "没选中");
                }
                startActivity(new Intent(WidgetActivity.this,
                        FragmentClazzActivity.class));
                //拓展   用于Activity信息回传,对应的回调方法onActivityResult
//                startActivityForResult();
            }
        });

        sbSeek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                Log.d(TAG,
                        String.format("onProgressChanged progress:%d", progress));

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                Log.d(TAG,
                        String.format("onStartTrackingTouch progress:%d", seekBar.getProgress()));
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                Log.d(TAG,
                        String.format("onStopTrackingTouch progress:%d", seekBar.getProgress()));
            }
        });
    }

    /**
     * 静态内部类
     */
    public static class ABC {
        public ABC(int i) {
        }
    }

    /**
     * 内部类
     * 创建一个对象，DEF的class文件，字节码，模板就被加载到虚拟机中一次
     * 尽量不要用内部类
     * 简单理解：只需要一个模板就可以创建对象了，所以不需要多余的模板
     */
    public class DEF {

    }
}
/*
一个模板对应多个实例、对象。
类和对象
普通方法和普通成员变量和内部类都属于对象。

提问：假设我想创建100个小兔子对象，那我需要几个类或者几个模板？
只需要一个类或者一个模板。

那么问题又来了。
提问：如果WidgetActivity创建了10个对象，DEF类是WidgetActivity的内部类，那么虚拟机中存在多少个DEF类或DEF模板？
10个
分析思路：
1.内部类属于对象
2.创建一个对象就对应一个内部类
3.创建十个对象就对应十个内部类

java三大特性：
封装：。。。
继承：。。。
多态：java语言单继承，多实现。
WidgetActivity extends AppCompatActivity  ：WidgetActivity（子类） 是 AppCompatActivity  （父类）类型的
AppCompatActivity extends FragmentActivity implements AppCompatCallback, SupportParentable, DelegateProvider
WidgetActivity（子类） 是 FragmentActivity （父类）类型的
WidgetActivity（子类） 是 AppCompatCallback（父类）类型的

四种引用：强、软、弱、虚

值传递、址传递
值传递：参数属于8种基本类型
址传递：对象、引用相关的

运算符：
算术
单目：++，--
注意：++i和i++的区别
双目：+-* /   % （取余）  instanceof
        三目：判断？对：错

        关系：

        逻辑：
        && || ！

        赋值运算符

        优先级：
        [ ] ( ) ++ -- ! ～ instanceof * / % + - << >> >>> <> < = > \ == != &^& & || ? := op=

        流程控制：
        while
        for

        判断：
        if
        switch

        方法：
        重写：同名同参，有@Override注解  参考onCreate()生命周期方法
        重载：同名不同参
        构造方法：

        提问：public static class ABC {}这个类有几个构造方法
public static class ABC {
    public ABC(int i){}
}几个构造方法

        容器：
        数组：要求内存连续
        假设需要5个单位的内存空间，但是，没有连续的5个单位的内存空间，就会OOM内存溢出。并不一定是内存空间不够了。
        列表：不要求内存空间连续
        集合：Set
        键值对：HashMap

        io流：字节流和字符流

        多线程：
        1.继承Thread
        2.创建Runnable
        3.Future/Callable

        网络请求操作，必须在子线程中进行。但是，细节实现不讲。
        不要使用new Thread()这个方式创建子线程。
        如果需要在子线程中运行，需要创建线程池。
        为什么呢？
        开启线程，需要消耗资源。频繁开启关闭线程，对资源浪费严重。

        泛型和RecyclerView控件一起讲。

        反射、注解  依据实际情况，看看需不需要讲解。
        retrofit 底层原理  反射

        Java编程思想  这本经典，必看

        Activity
        七大生命周期：onCreate onStart onResume  onPause  onStop  onDestroy  onRestart
        Intent
        跳转分为：显式  和  隐式
        四种启动模式：
        standard
        singleTop
        singleTask
        singleInstance
        注意一点：
        项目里面（自己启动自己的Activity）推荐使用显式启动
        安全

        Service 网络下载

        ContentProvider和Sqlite数据库一起讲

        Broadcast Receiver 什么时候讲都可以，最好还是Service之后

        Window 后续做项目时候

        Fragment和Dialog  接下来要讲的

        控件：
        布局：包裹控件的控件
        提问：LinearLayout可不可以包裹RelativeLayout？

        FrameLayout 帧布局 功能单一，一般配合Fragment使用

        ConstraintLayout 约束布局  功能强大！

        控件：
        ListView
        RecyclerView
        CardView

        自定义控件：
        自定义布局（ViewGroup）
        自定义控件（View）

        存储：
        SharedPreferences 工作当中非常常用的
        文件存储方式    io流
        Sqlite
        Content Provider 本质上 操作方法和数据库操作方法一样
        网络存储（服务器）  服务器使用Mysql、Oracle  真正实践的操作是网络操作

        版本控制工具
        svn图形界面化较好，只要了解了git的原理，使用svn没有难度。
        git 分布式   基本的使用方法、常见的问题、gitee
        */
